<?php
/**
 * @author		João Batista Neto
 * @package		rpo
 * @subpackage	http\interfaces
 * @category	Http, Client
 * @license		http://opensource.org/licenses/gpl-license.php GNU Public License
 */
namespace rpo\http\interfaces;

use \ArrayObject;
use rpo\base\String;
use rpo\http\interfaces\IHttpHeaderList;
use rpo\http\interfaces\IHttpState;

/**
 * Define a interface de uma conexão HTTP
 * @author		João Batista Neto
 * @package		rpo
 * @subpackage	http\interfaces
 * @category	Http, Client
 * @license		http://opensource.org/licenses/gpl-license.php GNU Public License
 */
interface IHttpConnection {
	/**
	 * HTTP/GET
	 */
	const GET		= 'GET';

	/**
	 * HTTP/POST
	 */
	const POST		= 'POST';

	/**
	 * HTTP/PUT
	 */
	const PUT		= 'PUT';

	/**
	 * HTTP/DELETE
	 */
	const DELETE	= 'DELETE';

	/**
	 * Muda o estado da conexão
	 * @param IHttpState $state
	 */
	public function changeState( IHttpState $state );

	/**
	 * Fecha a conexão ativa
	 */
	public function close();

	/**
	 * Recupera a lista de cabeçalhos enviados com a última requisição
	 * @return IHttpHeaderList
	 */
	public function getLastRequestHeaders();

	/**
	 * Recupera a lista de cabeçalhos recebidos na última requisição
	 * @return IHttpHeaderList
	 */
	public function getLastResponseHeaders();

	/**
	 * Recupera o recurso utilizado pela conexão
	 * @return resource
	 */
	public function getResource();

	/**
	 * Carrega dados do servidor
	 * @param integer $length
	 */
	public function load( $length );

	/**
	 * Abre uma conexão HTTP
	 * @param String $host
	 * @param integer $port
	 * @param boolean $secure
	 */
	public function open( String $host , $port = 80 , $secure = false );

	/**
	 * Envia dados ao servidor
	 * @param ArrayObject $data
	 * @param string $method
	 */
	public function send( ArrayObject $data , $method = IHttpConnection::GET );

	/**
	 * Envia e carrega dados do servidor
	 * @param ArrayObject $data
	 * @param integer $length
	 */
	public function sendAndLoad( ArrayObject $data , $length , $method = IHttpConnection::GET );

	/**
	 * Define os cabeçalhos Http que serão enviados com a requisição
	 * @param IHttpHeaderList $headers
	 */
	public function setRequestHeaders( IHttpHeaderList $headers );
}